<?php

namespace app\api\controller;

use app\common\controller\ApiBasic;
use app\common\service\sys\FilesService;

/**
 * 上传文件控制器
 * @auth kaige
 * @update 2022-06-02
 */
class Upload extends ApiBasic
{
  /**
   * 上传文件(支持批量)  集文档、图片、视频
   */
  public function upfiles()
  {
    //前端 分组ID 用的是 id （非group_id） 因多个页面需要调用 故省了group_
    $group_id = $this->request->param('id/d', 7); //默认7 未分类
    $uid = $this->user['id'];
    if (empty($uid)) {
      return _err('未登录');
    }
    if ($this->request->isPost()) {
      $key_name = "files"; // 前端input的name
      //接收上传的文件
      $files = $this->request->file($key_name); //文件(可以是多个，数组形式)
      if (empty($files)) {
        $file2 = $this->request->file('file');
        if(empty($file2)){
          return _err('缺少文件');
        }
        $files[0] = $file2;
        $key_name = 'file';
      }

      $company_id = $this->user['company_id'];
      $browser = getOS() . '|' . getBrowser();
      $ffs = new FilesService();
      $result = $ffs->upfiles($files, $uid, [
        'key_name' => $key_name,
        'group_id' => $group_id,
        'company_id' => $company_id,
        'browser' => $browser,
      ]);
      return json($result);
    }
  }

  /**下载文件 */
  public function down()
  {
    $id = input('id', '');
    if (empty($id)) {
      return json(_err('缺少参数'));
    } else {
      $fileInfo = (new FilesService())->getFileInfo($id);
      if ($fileInfo) {
        $filePath = app()->getRootPath() . 'public' . $fileInfo['path'];
        // 检查文件是否存在
        if (!file_exists($filePath)) {
          header('HTTP/1.1 404 NOT FOUND');
        } else {
          // 以只读和二进制模式打开文件
          $file = fopen($filePath, "rb");
          // 告诉浏览器这是一个文件流格式的文件
          Header("Content-type: application/octet-stream");
          // 请求范围的度量单位
          Header("Accept-Ranges: bytes");
          // Content-Length是指定包含于请求或响应中数据的字节长度
          Header("Accept-Length: " . filesize($filePath));
          // 用来告诉浏览器，文件是可以当做附件被下载，下载后的文件名称为$file_name该变量的值。
          Header("Content-Disposition: attachment; filename=" . md5($fileInfo['hash']) . '.' . $fileInfo['file_ext']);
          //ob_clean(); // 重点！！！
          //flush(); // 重点！！！！可以清除文件中多余的路径名以及解决乱码的问题：
          // 读取文件内容并直接输出到浏览器
          echo fread($file, filesize($filePath));
          fclose($file);
        }
      } else {
        return json(_err('缺少参数'));
      }
    }
  }
}
